home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / p063b9s.zip / UNIT / MACRO.PAS < prev    next >
Pascal/Delphi Source File  |  1996-04-20  |  9KB  |  318 lines

  1. UNIT Macro;
  2. {╔══════════════════════════════════════════════════════════════════════════╗}
  3. {║ Keyboard mscros                               Last changed: 20.04.96  SA ║}
  4. {║                                                                          ║}
  5. {║                         (C) Copyright 1989-94 by                         ║}
  6. {║       Dan Wulff, Jens Sandalgaard, Steen Christensen & S¢ren Ager        ║}
  7. {║                                                                          ║}
  8. {║ This source may not be given to anybody, without the written permission  ║}
  9. {║ from The Portal Team.                                                    ║}
  10. {╚══════════════════════════════════════════════════════════════════════════╝}
  11. {$I POPDEFS.INC}
  12.  
  13. INTERFACE
  14.  
  15. USES Use32;
  16.  
  17. PROCEDURE WriteMacroStatus;
  18. PROCEDURE MacroMenu(VAR Key: LongInt);
  19.  
  20. IMPLEMENTATION
  21.  
  22. USES Dos, OpMacro, OpString, OpCrt, OpCmd, OpWindow, OpMacEd,
  23.      Util, StrUtil, OproUtil, Input, LogFile, KeyBoard, Globals,
  24.      MTask, PoPTypes;
  25.  
  26.  
  27.   PROCEDURE WriteMacroStatus;
  28.   VAR
  29.     ch : Char;
  30.   BEGIN
  31.     IF NOT InLogWin THEN ch:='─' ELSE ch:='═';
  32.     IF NOT KeyboardLock THEN
  33.     BEGIN
  34.       IF MacroRecording THEN
  35.         StatusStr:='*** REC *'
  36.       ELSE
  37.         IF MacrosAreOn THEN
  38.           StatusStr:='* MACRO *'
  39.         ELSE
  40.           StatusStr:='*********';
  41.     END ELSE
  42.       StatusStr:='** LOCK *';
  43.     Replace(StatusStr,'*',ch,0);
  44.     ActivityWindow^.ActivateWrite;
  45.     ActivityWindow^.ChangeHeader(1, StatusStr);
  46.     ActivityWindow^.DeActivateWrite;
  47.   END;
  48.  
  49.   PROCEDURE MacroMenu(VAR Key: LongInt);
  50.   VAR
  51.     TempMacroName  : S60;
  52.     LastCmd        : Word;
  53.  
  54.     FUNCTION GetFileName(VAR escaped : Boolean) : PathStr;
  55.     VAR
  56.       FileName : PathStr;
  57.     BEGIN
  58.       FileName := '';
  59.       Escaped:=NOT InputString(15,16,36,36,3,'Macro name','File name: ',FileName);
  60.       GetFileName := FileName;
  61.     END;
  62.  
  63.     PROCEDURE EditMacro;
  64.     CONST
  65.       NullString : string[1] = '';
  66.     VAR
  67.       Modified : Boolean;
  68.       TempWin : WindowPtr;
  69.       MP     : MacroRecPtr;
  70.       TempMacroKey, N : Word;
  71.       SaveWin : Pointer;
  72.       SP : StringPointer;
  73.       TempMacroName : S80;
  74.     BEGIN
  75.       MacrosOff;
  76.       MyWin(TempWin, 21,12,59,14,2,'Edit Macro',True);
  77.       Write(' Press the macrokey you want to edit');
  78.       TempMacroKey:=ReadKeyWord;
  79.       KillWindow(TempWin);
  80.       N:=FindMacroIndex(TempMacroKey);
  81.       IF N<>0 THEN
  82.       BEGIN
  83.         MP:=MacroPointers[N];
  84.         SP:=MacroNames[N];
  85.         if (SP=nil) then SP:=@NullString;
  86.         TempMacroName:=SP^;
  87.  
  88.         SaveWindow(1,1,ScreenWidth,ScreenHeight,True,SaveWin);
  89.         WITH Cfg.Color[3] DO
  90.           MP:=EditKeys(TempMacroKey,MP^, 1, 2, ScreenWidth, ScreenHeight, TextColor, HighlightColor, Modified);
  91.         RestoreWindow(1, 1, ScreenWidth, ScreenHeight, True, SaveWin);
  92.         if (TempMacro.NumKeys=0) then
  93.         begin
  94.           DeallocateMacro(TempMacroKey);
  95.           AddLog(' ', 'Macro deleted');
  96.         end else
  97.           {allocate space for and define the macro if it was changed}
  98.           if Modified then
  99.             case AllocateMacro(TempMacroKey, MP^, TempMacroName) of
  100.               1..2 : {ErrorMessage(OutOfMemory)};
  101.             end;
  102.  
  103.       END;
  104.       MacrosOn;
  105.     END;
  106.  
  107.     PROCEDURE ListMacros;
  108.     VAR
  109.       Name           : ^String;
  110.       i, key         : Word;
  111.       s              : String;
  112.       Special        : Boolean;
  113.       ListWin        : windowptr;
  114.     BEGIN
  115.       mywin(ListWin, 1, 2, 80, ScreenHeight, 3, 'Defined Macros',False);
  116.       Write(' Key         Description');
  117.       GOTOXY(1, 2);
  118.       FOR i := 1 TO MaxMacros DO
  119.       BEGIN
  120.         key := DefinedKeys[i];
  121.         IF key<>EndOfMacro THEN
  122.         BEGIN
  123.           KeyToString(key, s, Special);
  124.           Name:=MacroNames[i];
  125.           WriteLn(' '+CPad(s,12), Name^);
  126.         END;
  127.       END;
  128.       REPEAT
  129.         GiveUpTime;
  130.       UNTIL GotESC;
  131.       KillWindow(ListWin);
  132.     END;
  133.  
  134.     PROCEDURE RecordingOn;
  135.     VAR
  136.       TempWin: WindowPtr;
  137.       S : String;
  138.       Special : Boolean;
  139.     BEGIN
  140.       MacrosOff;
  141.       MacrosOn;
  142.       ScrapMacro.NumKeys := 0;
  143.       ScrapMacro.KeyArray[1] := EndOfMacro;
  144.       REPEAT
  145.         MyWin(TempWin, 21,12,59,14,2,'Record macro',True);
  146.         Write(' Press the key you want to redefine');
  147.         ScrapMacroKey := ReadKeyWord;
  148.         KillWindow(TempWin);
  149.         KeyToString(ScrapMacroKey, S, Special);
  150.       UNTIL (ScrapMacroKey=$011b) or (Confirm('Redefine '+S+' ?','N',11));
  151.       IF ScrapMacroKey<>$011b THEN
  152.       BEGIN
  153.         DeAllocateMacro(ScrapMacroKey);
  154.         MacroRecordingOn;
  155.         WriteMacroStatus;
  156.       END;
  157.     END;
  158.  
  159.     PROCEDURE LoadMacros;
  160.     VAR
  161.       FileName : PathStr;
  162.       Merge    : Boolean;
  163.       Err      : Byte;
  164.     BEGIN
  165.       Merge:=(MacroCount>0) AND Confirm('Merge loaded macros with existing?','N',10);
  166.       FileName:=StartPath+'*.MAC';
  167.       IF NOT SelectFile(FileName) OR (FileName = '') THEN Exit;
  168.       Err:=ReadMacroFile(FileName, Merge);
  169.       CASE Err OF
  170.         0  : AddLog(' ','Macro file '''+FileName+''' loaded');
  171.         2  : AddLog(' ',FileName+' does not exist');
  172.         $fe: AddLog(' ','Load macro: Out of heap space');
  173.         $ff: Addlog(' ',FileName+' is not a valid macro file');
  174.         ELSE AddLog(' ','Load macro: I/O Error '+Long2Str(Err));
  175.       END;
  176.     END;
  177.  
  178.     PROCEDURE SaveMacros;
  179.     VAR
  180.       FileName  : PathStr;
  181.       escaped   : Boolean;
  182.       Err       : Byte;
  183.     BEGIN
  184.       FileName:=GetFileName(Escaped);
  185.       IF (Escaped) OR (FileName='') THEN Exit;
  186.       Err:=WriteMacroFile(FileName);
  187.       CASE Err OF
  188.         0 :  AddLog(' ','Macro file '''+FileName+''' saved');
  189.         ELSE AddLog(' ','Save macro: I/O Error '+Long2Str(Err));
  190.       END;
  191.     END;
  192.  
  193.     PROCEDURE DeleteOneMacro;
  194.     VAR
  195.       DelMacroKey : Word;
  196.       TempWin     : WindowPtr;
  197.       s           : String;
  198.       Special     : Boolean;
  199.     BEGIN
  200.       MacrosOff;
  201.       REPEAT
  202.         MyWin(TempWin, 20,12,60,14,2,'Delete macro',True);
  203.         Write(' Press the macrokey you want to delete');
  204.         DelMacroKey := ReadKeyWord;
  205.         KillWindow(TempWin);
  206.         KeyToString(DelMacroKey, S, Special);
  207.       UNTIL (DelMacroKey=$011b) Or (Confirm('Delete '+S+' ?','N',11));
  208.       IF DelMacroKey<>$011b THEN
  209.         DeAllocateMacro(DelMacroKey);
  210.       MacrosOn;
  211.       MainMenu^.EraseCurrentSubMenu;
  212.     END;
  213.  
  214.     PROCEDURE DeleteAllMacros;
  215.     VAR
  216.       i              : Word;
  217.     BEGIN
  218.       FOR i := 1 TO MaxMacros DO
  219.         IF DefinedKeys[i]<>EndOfMacro THEN DeAllocateMacro(DefinedKeys[i]);
  220.       MainMenu^.EraseCurrentSubMenu;
  221.     END;
  222.  
  223.     PROCEDURE EnableItems;
  224.     VAR
  225.       i : LongInt;
  226.     BEGIN
  227.       FOR i:=100 TO 108 DO
  228.         IF i<>107 THEN MainMenu^.UnProtectItem(i);
  229.     END;
  230.  
  231.     PROCEDURE DisableItems;
  232.     VAR
  233.       i : LongInt;
  234.     BEGIN
  235.       FOR i:=100 TO 108 DO
  236.         IF i<>107 THEN MainMenu^.ProtectItem(i);
  237.     END;
  238.  
  239.   BEGIN
  240.     IF MacroRecording THEN
  241.     BEGIN
  242.       MacroRecordingOff;
  243.       WITH ScrapMacro DO
  244.         KeyArray[NumKeys]:=EndOfMacro;
  245.       IF ScrapMacro.NumKeys=0 THEN
  246.       BEGIN
  247.         DeAllocateMacro(ScrapMacroKey);
  248.         AddLog(' ','Empty macro - not added');
  249.       END ELSE
  250.       BEGIN
  251.         TempMacroName := '';
  252.         IF InputString(2,11,60,60,2,'Save macro','Macro name: ',TempMacroName) THEN
  253.         BEGIN
  254.           IF TempMacroName='' THEN TempMacroName:='Unnamed';
  255.           CASE AllocateMacro(ScrapMacroKey, ScrapMacro, TempMacroName) OF
  256.             1  : AddLog(' ','Macro table full');
  257.             2  : AddLog(' ','Out of memory');
  258.             ELSE AddLog(' ','Macro added');
  259.           END;
  260.         END;
  261.       END;
  262.       IF Key<>0 THEN MainMenu^.Erase;
  263.       WriteMacroStatus;
  264.       Exit;
  265.     END;
  266.  
  267.     LoadMainMenu;
  268.     IF Key=0 THEN
  269.     BEGIN
  270.       DisableItems;
  271.       MainMenu^.SelectSubMenu(90);
  272.     END;
  273.  
  274.     InMainMenu:=True;
  275.     REPEAT
  276.       IF Key=0 THEN
  277.       BEGIN
  278.         MainMenu^.Process;
  279.         Key:=MainMenu^.MenuChoice;
  280.         LastCmd:=MainMenu^.GetLastCommand;
  281.       END ELSE
  282.         LastCmd:=ccSelect;
  283.       IF LastCmd<>ccQuit THEN
  284.       BEGIN
  285.         CASE key OF
  286.           90: BEGIN
  287.                 RecordingOn;
  288.                 IF MacroRecording THEN LastCmd:=ccQuit;
  289.               END;
  290.           91: EditMacro;
  291.           92: ListMacros;
  292.  
  293.           93: BEGIN
  294.                 MacrosAreOn:=NOT MacrosAreOn;
  295.                 Data.MacroStatus:=MacrosAreOn;
  296.                END;
  297.           94: DeleteOneMacro;
  298.           95: IF Confirm('Delete ALL macros ?','N',12) THEN DeleteAllMacros;
  299.           96: LoadMacros;
  300.           97: SaveMacros;
  301.         END;
  302.         IF Key IN [90..97] THEN
  303.         BEGIN
  304.           MainMenuToggle;
  305.           Key:=0;
  306.         END;
  307.       END;
  308.       WriteMacroStatus;
  309.     UNTIL (LastCmd=ccQuit) OR (Key<>0);
  310.     InMainMenu:=False;
  311.     EnableItems;
  312.  
  313.     IF (Key>40) OR (Key=0) THEN MainMenu^.EraseAllSubMenus(True, True);
  314.     MainMenu^.Erase;
  315.   END;
  316.  
  317. END.
  318.